﻿using UnityEngine;
using System.Collections;

public class SimpleTextInput : MonoBehaviour
{
	public delegate void CommitCB(string text);

	// Properties

	[SerializeField]
	TextMesh			m_textMesh;				// 텍스트 표시
	[SerializeField]
	TextMesh			m_cursorTrace;			// 커서 표시용
	[SerializeField]
	bool				m_upperCase;			// 전부 대문자로


	// EventHandlers

	/// <summary>
	/// 엔터 눌렀을 시 호출됨
	/// </summary>
	public event CommitCB Committed;

	bool m_firstFrameAfterEnable	= false;


	void Update()
	{
		string text			= m_textMesh.text;
		bool confirm		= false;

		foreach(char c in Input.inputString)
		{
			switch(c)
			{
			case '\b':// Backspace
				if(text.Length > 0)
					text	= text.Substring(0, text.Length - 1);
				break;

			case '\n':
			case '\r':	// Enter
				confirm		= true;
				break;

			default:
			text			+= m_upperCase? char.ToUpper(c) : c;
				break;
			}

			if(confirm)							// 중간에 엔터를 쳤으면 뒤쪽에 같이 입력된 문자들은 모두 무시
				break;
		}

		m_textMesh.text		= text;

		string cursorSpace	= "";				// 커서 표시
		for(int i = 0; i < text.Length; i++)
			cursorSpace		+= " ";

		m_cursorTrace.text	= cursorSpace + "_";

		if(confirm && !m_firstFrameAfterEnable && Committed != null)	// 이벤트 호출 (Enable 이후 첫 프레임에는 호출하지 않는다)
			Committed(text);

		m_firstFrameAfterEnable	= false;
	}

	public void Clear()
	{
		m_textMesh.text	= "";
	}

	void OnEnable()
	{
		StartCoroutine(CursorBlink());
		m_firstFrameAfterEnable	= true;			// "Enable 이후 첫 프레임" 플래그를 올린다
	}

	/// <summary>
	/// 커서 깜박이기
	/// </summary>
	/// <returns>The blink.</returns>
	IEnumerator	CursorBlink()
	{
		while(true)
		{
			yield return new WaitForSeconds(0.3f);
			m_cursorTrace.renderer.enabled	= !m_cursorTrace.renderer.enabled;
		}
	}
}
